<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>

  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

  <meta name="Author" content="Wilbert Dijkhof">
  <title>Filtre AviSynth ConditionalFilter</title>


  <link rel="stylesheet" type="text/css" href="../../avisynth.css">

</head>


<body>

<h2>
<a name="ConditionalFilter"></a>ConditionalFilter
</h2>

<p><code>ConditionalFilter </code>(<var>clip
testclip, clip source1, clip source2,
string filter, string operator, string value, bool "show"</var>)
</p>

<p><code>ConditionalFilter</code> renvoie <var>source1</var>
quand la condition form&eacute;e par ''filter+operator+value''
(filtre+op&eacute;rateur+valeur) est remplie. Sinon, il renvoie <var>source2</var>.
Si <var>filter</var> n'est pas explicitement
appliqu&eacute; &agrave; un clip, il sera appliqu&eacute;
sur&nbsp;<var>testclip</var>. Le flux audio est pris
dans&nbsp;<var>source1</var>.
</p>

<p>Voici un exemple. Il choisit une image de la vid&eacute;o
vid_blur quand la valeur moyenne de la luminance de cette image est
inf&eacute;rieure &agrave; 20. Sinon, une image de vid est
renvoy&eacute;e.
</p>

<pre>vid = AviSource("file")<br>vid_blur = vid.Blur(1.5)<br>ConditionalFilter(vid, vid_blur, vid, "AverageLuma()", "lessthan", "20")</pre>

<p>En ajoutant&nbsp;<var>show</var>="true"
(vrai), cela affiche les valeurs calcul&eacute;es sur l'image.
</p>

<p>La cha&icirc;ne <var>filter</var> peut
&ecirc;tre n'importe quel filtre interne, mais &eacute;galement
certains filtres pr&eacute;d&eacute;finis (<a href="#RuntimeFunctions">les fonctions d'ex&eacute;cution</a>).
<br>

La cha&icirc;ne <var>operator</var> peut
&ecirc;tre "equals" (&eacute;gal &agrave;),
"greaterthan" (sup&eacute;rieur &agrave;) ou "lessthan"
(inf&eacute;rieur &agrave;).
Ou bien "=", "&gt;" or "&lt;" respectivement.
</p>

<h2><a name="ScriptClip"></a>ScriptClip
</h2>

<p><code>ScriptClip </code>(<var>clip, string
function, bool "show", bool
"after_frame"</var>)
</p>

<p><code>ScriptClip</code> renvoie le clip
renvoy&eacute; par <var> function</var>
&eacute;valu&eacute; pour chaque image. La cha&icirc;ne <var>filter</var>
peut &ecirc;tre n'importe quel filtre interne mais
&eacute;galement certains filtres pr&eacute;d&eacute;finis (<a href="conditionalfilter.htm#RuntimeFunctions">les fonctions
d'ex&eacute;cution</a>).&nbsp;En ajoutant&nbsp;<var>show</var>="true"
(vrai), cela affiche les valeurs calcul&eacute;es sur l'image.
</p>

Quelques exemples: <br>

<pre># Cela affiche la diff&eacute;rence de luminance avec l'image pr&eacute;c&eacute;dente sur l'image actuelle:<br>clip = AviSource("c:\file.avi")<br>ScriptClip(clip, "Subtitle(String(YDifferenceFromPrevious))")<br><br># Cela applique un flou (blur) dont la force est bas&eacute;e sur la diff&eacute;rence de luminance avec l'image pr&eacute;c&eacute;dente.<br># Cela montre &eacute;galement comment les erreurs sont renvoy&eacute;es sur certaines images :)<br>clip = AviSource("c:\file.avi")<br>ScriptClip(clip, "Blur(YDifferenceFromPrevious/20.0)")<br><br># Cela applique le filtre temporalsoften sur les sc&egrave;nes tr&egrave;s statiques, et applique un flou variable sur les sc&egrave;nes avec du mouvement.<br># Le filtre blur (flou) est maintenant &eacute;crit de mani&egrave;re correcte. Nous assignons &eacute;galement une variable<br># et c'est la raison pour laquelle nous avons un retour &agrave; la ligne:<br>function fmin(float f1, float f2) {<br>&nbsp; return (f1&lt;f2) ? f1 : f2<br>}<br>clip = AviSource("c:\file.avi")<br>ScriptClip(clip, "diff = YDifferenceToNext()"+chr(13)+"diff &gt; 2.5 ? Blur(fmin(diff/20,1.5)) : TemporalSoften(2,7,7,3,2)")<br><br># Affiche le num&eacute;ro de l'image d'un clip:<br>ScriptClip("subtitle(string(current_frame))")<br><br># Affiche 'frame = le num&eacute;ro d'image' sur un clip:<br>ScriptClip("""subtitle("frame = " + string(current_frame))""")</pre>

<p>Dans&nbsp;v2.55 une option <i><var>after_frame=true/false</var></i>
(vrai/faux) a &eacute;t&eacute; ajout&eacute;e. Elle
indique si le script doit &ecirc;tre &eacute;valu&eacute;
avant (par d&eacute;faut) ou apr&egrave;s que &nbsp;les
filtres soient appliqu&eacute;s &agrave; l'image.</p>

<p>"Restrictions": la sortie du script DOIT &ecirc;tre
exactement similaire au clip fourni &agrave; <code>ScriptClip</code>
(m&ecirc;me espace de couleurs,
largeur et hauteur). Le clip renvoy&eacute; peut avoir une longueur
diff&eacute;rente - mais la longueur de "clip" est toujours
utilis&eacute;e. L'audio de "clip" est transmis sans modifications.
Pour deux sources assez diff&eacute;rentes (MPEG2DEC3 et AviSource
par exemple) - vous pouvez rencontrer des erreurs de correspondance
d'espace de couleur. C'est un caprice connu.
</p>

<h2><a name="FrameEvaluate"></a>FrameEvaluate
</h2>

<p><code>FrameEvaluate </code>(<var>clip clip,
script function, bool "after_frame"</var>)
</p>

<p>Similaire &agrave; <code>ScriptClip</code>,
sauf que la sortie du filtre est ignor&eacute;e. Cela peut
&ecirc;tre utile pour assigner des variables, etc... Les images
sont directement transmises &agrave; partir du clip source.
<br>

Dans v2.53 l'option <var>after_frame</var>=<code>true/false</code>&nbsp;(vrai/faux)
a &eacute;t&eacute; ajout&eacute;e. Cela indique si le
script doit &ecirc;tre &eacute;valu&eacute;
avant (par d&eacute;faut) ou apr&egrave;s que &nbsp;les
filtres soient appliqu&eacute;s &agrave; l'image.
</p>

<h2><a name="ConditionalReader"></a>ConditionalReader</h2>

<p>Cela permet d'importer une information dans une variable
donn&eacute;e.
</p>

<p>Voir la page d&eacute;di&eacute;e &agrave; <a href="conditionalreader.htm">ConditionalReader</a>.</p>

<h2><a name="RuntimeFunctions"></a>Fonctions
d'ex&eacute;cution
</h2>

<p>Voici les fonctions internes qui sont
&eacute;valu&eacute;es pour chaque image.
</p>

<p>Cela renvoie la valeur moyenne de la valeur des pixels suivant
un canal donn&eacute; (n&eacute;cessite
YV12,
ISSE):
<br>

<code>AverageLuma </code>(<var>clip</var>)<br>

<code>AverageChromaU </code>(<var>clip</var>)<br>

<code>AverageChromaV </code>(<var>clip</var>)
</p>

<p>Cela renvoie un flottant compris entre 0 et 255 qui correspond
&agrave; la valeur absolue de la diff&eacute;rence entre deux
canaux (n&eacute;cessite YV12, ISSE):
<br>

<code>RGBDifference </code>(<var>clip1, clip2</var>)<br>

<code>LumaDifference </code>(<var>clip1, clip2</var>)<br>

<code>ChromaUDifference </code>(<var>clip1, clip2</var>)<br>

<code>ChromaVDifference </code>(<var>clip1, clip2</var>)
</p>

<p>Quand vous utilisez ces fonctions, il y a implicitement un
clip d&eacute;fini comme le premier argument de la fonction (le premier
argument n'a pas besoin d'&ecirc;tre
sp&eacute;cifi&eacute;).
</p>

<p>Les fonctions suivantes peuvent &ecirc;tre bien utiles pour
d&eacute;tecter des changements de sc&egrave;nes:<br>

<code>RGBDifferenceFromPrevious </code>(<var>clip</var>)<br>

<code>YDifferenceFromPrevious </code>(<var>clip</var>)<br>

<code>UDifferenceFromPrevious </code>(<var>clip</var>)<br>

<code>VDifferenceFromPrevious </code>(<var>clip</var>)<br>

<code>RGBDifferenceToNext </code>(<var>clip</var>)<br>

<code>YDifferenceToNext </code>(<var>clip</var>)<br>

<code>UDifferenceToNext </code>(<var>clip</var>)<br>

<code>VDifferenceToNext </code>(<var>clip</var>)<br>

&nbsp;
</p>

<pre># Cela remplace la derni&egrave;re image avant un changement de sc&egrave;ne<br># par la premi&egrave;re image apr&egrave;s le changement de sc&egrave;ne:<br>ConditionalFilter(last, last, last.trim(1,0), "YDifferenceToNext()", "&gt;", "10", true)</pre>

<h4>Autres fonctions internes:</h4>

<p><code>YPlaneMax </code>(<var>clip, float
threshold</var>)<br>

<code>UPlaneMax </code>(<var>clip, float threshold</var>)<br>

<code>VPlaneMax </code>(<var>clip, float threshold</var>)<br>

<code>YPlaneMin </code>(<var>clip, float threshold</var>)<br>

<code>UPlaneMin </code>(<var>clip, float threshold</var>)<br>

<code>VPlaneMin </code>(<var>clip, float threshold</var>)<br>

<code>YPlaneMedian </code>(<var>clip</var>)<br>

<code>UPlaneMedian </code>(<var>clip</var>)<br>

<code>VPlaneMedian </code>(<var>clip</var>)<br>

<code>YPlaneMinMaxDifference </code>(<var>clip,
float threshold</var>)<br>

<code>UPlaneMinMaxDifference </code>(<var>clip,
float threshold</var>)<br>

<tt><code>VPlaneMinMaxDifference </code></tt>(<i><var>clip,
float threshold</var></i>)
</p>

<p><var>Threshold</var> est un pourcentage. Il
repr&eacute;sente le pourcentage de pixels permis en dessous du
minimum. Le threshold est optionnel et par d&eacute;faut
&agrave; 0.&nbsp;
</p>

<p>Si vous avez bien compris ce qui
pr&eacute;c&egrave;de, vous pouvez continuer avec la partie
"filtrage conditionnel avanc&eacute;", qui vous en dira plus au
sujet du filtrage conditionnel.
</p>

<h2>Filtrage conditionnel avanc&eacute;: partie I</h2>

<p>Vous devez en savoir un peu plus sur le fonctionnement
d'AviSynth pour bien comprendre cette partie:<br>

Les scripts sont analys&eacute;s du haut vers le bas, mais quand
une image est demand&eacute;e, le dernier filtre est
invoqu&eacute; en premier, en demandant des images
pr&eacute;c&eacute;dente dans la cha&icirc;ne de filtres.
Par exemple:</p>

<pre>AviSource("myfile.avi")<br>ColorYUV(analyze=true)<br>Histogram()</pre>

Quand vous ouvrez ce script dans VirtualDub, voici ce qui se passe:
<ul>

  <li>Quand VirtualDub demande une image, Avisynth demande cette
image au filtre Histogram.</li>

  <li>
Histogram demande cette image &agrave; ColorYUV,</li>

  <li>
ColorYUV demande l'image &agrave;&nbsp;AviSource, qui
cr&eacute;e l'image, et la renvoie &agrave; ColorYUV.</li>

  <li>
ColorYUV travail sur l'image et la renvoie &agrave; Histogram, qui
la renvoie ensuite &agrave; VirtualDub.</li>

</ul>

La cha&icirc;ne des filtres travaille donc vers
l'arri&egrave;re, cela donne la possibilit&eacute; de demander
plusieurs images de la source pr&eacute;c&eacute;dente.
<p>Cependant, Conditional filters doit &eacute;valuer les
scripts <i>avant</i>
qu'ils ne demandent des images au filtre pr&eacute;c&eacute;dent, parce qu'ils ont besoin de savoir quel filtre invoquer. Une cons&eacute;quence importante de ceci est que seules des variables <code>globales</code> dans l'environnement&nbsp;conditional filter peuvent &ecirc;tre utilis&eacute;es en dehors (et vice versa). Jetez un oeil au script suivant:
</p>

<pre>v = AviSource("E:\Temp\Test3\atomic_kitten.avi").ConvertToYV12<br><br>function g(clip c)<br>{<br>&nbsp; <b>global</b> <b>w</b> = c<br>&nbsp; c2 = ScriptClip(c, "subtitle(t)")<br>&nbsp; c3 = FrameEvaluate(c2, "t = String(text)")<br>&nbsp; c4 = FrameEvaluate(c3, "text = YDifferenceFromPrevious(<b>w</b>)")<br>&nbsp; return c4<br>}<br><br>g(v)</pre>
Cette cha&icirc;ne de filtres fonctionne de la fa&ccedil;on suivante:
<ul>

  <li>Quand VirtualDub demande une image, AviSynth demande une image &agrave; g().</li>

  <li>
g() demande une image &agrave; AviSource():</li>

  <ul>

    <li>
AviSynth demande une image au deuxi&egrave;me&nbsp;FrameEvaluate.</li>

    <li>Le deuxi&egrave;me FrameEvaluate &eacute;value <i>YDifferenceFromPrevious(w)</i> et renvoie son r&eacute;sultat &agrave; la variable <i>text</i>,
apr&egrave;s avoir demand&eacute; une image d'AviSource. Apr&egrave;s
cela, une image est demand&eacute;e au premier FrameEvaluate.</li>

    <li>Le premier FrameEvaluate demande une image &agrave; ScriptClip apr&egrave;s avoir &eacute;valu&eacute; <i>String(text)</i>
et envoy&eacute; le r&eacute;sultat &agrave; la variable <i>t.</i></li>

    <li>
ScriptClip demande une image &agrave; ConvertToYV12(), en &eacute;valuant <i>Subtitle(t)</i>
sur cette image.</li>

    <li>
ConvertToYV12() demande une image &agrave; AviSource().</li>

  </ul>

  <li>
AviSource() cr&eacute;e l'image et l'envoie &agrave; g(), qui renvoie le r&eacute;sultat &agrave;
VirtualDub.</li>

</ul>
Comme on peut le voir,&nbsp;<b>w</b> est d&eacute;finie comme une
variable globale.
De cette mani&egrave;re, nous pourrons l'utiliser plus tard dans le
script dans l'environnement conditionnel. Si nous souhaitons utiliser
les variables&nbsp;<b>t</b> et <b>text</b>
dans une fonction diff&eacute;rente (&agrave; l'int&eacute;rieur ou
&agrave; l'ext&eacute;rieur de l'environnement conditionnel), elles
doivent &eacute;galement &ecirc;tre d&eacute;finies comme variables
globales. Voici un exemple:

<pre>v = AviSource("E:\Temp\Test3\atomic_kitten.avi").ConvertToYV12<br><br>function g(clip c)<br>{<br>&nbsp; global w = c<br>&nbsp; c2 = ScriptClip(c, "subtitle(<b>t</b>)")<br>&nbsp; c3 = FrameEvaluate(c2, "me()")<br>&nbsp; c4 = FrameEvaluate(c3, "<b>global</b> <b>text</b> = YDifferenceFromPrevious(w)")<br>&nbsp; return c4<br>}<br><br>function me()<br>{<br>&nbsp; <b>global</b> <b>t</b> = String(<b>text</b>)<br>}<br><br>g(v)</pre>
Une grande partie du script pr&eacute;c&eacute;dent est redondante et
peut &ecirc;tre supprim&eacute;e. Le script suivant est
&eacute;quivalent.

<pre>v = AviSource("c:\clip.avi")<br>ScriptClip(v, "Subtitle(String(YDifferenceFromPrevious))")<br></pre>
Dans la partie suivante, des informations d&eacute;pendants des images vont &ecirc;tre &eacute;crites dans un fichier texte.
<h2>Filtrage conditionnel avanc&eacute;: partie II</h2>

<p>Dans l'exemple suivant, des informations d&eacute;pendants des images vont &ecirc;tre &eacute;crites dans un fichier texte.
La premi&egrave;re variable "a" indique si l'image subit un effet de
peigne (li&eacute; &agrave; l'entrelacement ou au processus Telecine).
Notez que le filtre IsCombed fait partie du plugin Decomb. La seconde
variable "b" indique s'il y a beaucoup de mouvement dans l'image.</p>

<pre>global sep="."<br>global combedthreshold=25<br><br>function IsMoving()<br>{<br>global b = (diff &lt; 1.0) ? false : true<br>}<br><br>function CombingInfo(clip c)<br>{<br>file = "F:\interlace.log"<br>global clip = c<br>c = WriteFile(c, file, "a", "sep", "b")<br>c = FrameEvaluate(c, "global a = IsCombed(clip, combedthreshold)")<br>c = FrameEvaluate(c, "IsMoving")<br>c = FrameEvaluate(c,"global diff = 0.50*YDifferenceFromPrevious(clip) + 0.25*UDifferenceFromPrevious(clip) + 0.25*VDifferenceFromPrevious(clip)")<br>return c<br>}<br><br>v = mpeg2source("F:\From_hell\from_hell.d2v").trim(100,124)<br>CombingInfo(v)</pre>

<p>Dans la partie suivante, nous allons &eacute;tudier un filtre de redimenssionement adaptatif en fonction du mouvement.</p>

<h2>Filtrage conditionnel avanc&eacute;: partie III</h2>

<p>On a vu appara&icirc;tre sur les forums quelques filtres de
redimenssionement adaptatifs en fonction du mouvement. Ces filtres font
une diff&eacute;rence entre les mouvements lents, moyens et rapides
(&agrave; l'&eacute;chelle de l'image). En faisant cela, des filtres
diff&eacute;rents peuvent &ecirc;tre utilis&eacute;s pour chaque type
de mouvement dans le clip. En g&eacute;n&eacute;ral, on utilise un
lissage temporel dans les sc&egrave;nes lentes, un lissage spatial dans
les sc&egrave;nes rapides et un lissage spatio/temporel dans les
sc&egrave;nes interm&eacute;diaires.<br>
Ci dessous , une version simplifi&eacute;e de QUANTIFIED MOTION FILTER v1.5 b1
(10/07/2003)
de HomiE FR:</p>

<pre>---------------------------------------------------- <br># QUANTIFIED MOTION FILTER v1.3 <br># CHARGEMENT DES PLUGINS AVISYNTH <br>LoadPlugin("C:\PROGRA~1\GORDIA~1\mpeg2dec3.dll") <br>LoadPlugin("C:\PROGRA~1\GORDIA~1\TemporalCleaner.dll") <br>LoadPlugin("C:\PROGRA~1\GORDIA~1\FluxSmooth.dll") <br>LoadPlugin("C:\PROGRA~1\GORDIA~1\UnFilter.dll")<br><br># CHARGEMENT DU SCRIPT QUANTIFIED MOTION FILTER<br><br>Import("E:\temp\QMF\qmf.avs")<br><br># LOW MOTION FILTER FUNCTION (FONCTION POUR FILTRE DE MOUVEMENT FAIBLE)<br># -&gt; REDIMENSSIONEMENT PRECIS + FILTRAGE TEMPOREL SEULEMENT<br>function Low_Motion_Filter(clip c)<br>{<br>&nbsp; c = TemporalCleaner(c, 5, 10)<br>&nbsp; c = LanczosResize(c, 512, 272)<br>&nbsp; return c<br>}<br><br># MEDIUM MOTION FILTER FUNCTION (FONCTION POUR FILTRE DE MOUVEMENT INTERMEDIAIRE)<br># -&gt; REDIMENSSIONEMENT DE TYPE 'NEUTRAL BICUBIC' + FILTRAGE TEMPOREL &amp; SPATIAL<br>function Medium_Motion_Filter(clip c)<br>{<br>&nbsp; c = FluxSmooth(c, 7, 7)<br>&nbsp; c = BicubicResize(c, 512, 272, 0.00, 0.50)<br>&nbsp; return c<br>}<br><br># HIGH MOTION FILTER FUNCTION (FONCTION POUR FILTRE DE MOUVEMENT RAPIDE)<br># -&gt; REDIMENSSIONEMENT DOUX + FILTRAGE SPATIAL SEULEMENT<br>function High_Motion_Filter(clip c)<br>{<br>&nbsp; c = FluxSmooth(c, -1, 14)<br>&nbsp; c = UnFilter(c, -30, -30)<br>&nbsp; c = BilinearResize(c, 512, 272)<br>&nbsp; return c<br>}<br><br># OUVERTURE DE LA SOURCE VIDEO<br>AviSource("E:\temp\QMF\britney-I_love_rock_'n_roll.avi")<br>ConvertToYV12(interlaced=true)<br>Telecide(0)<br><br># UTILISATION DU FILTRE ADAPTATIF DE REDIMENSSIONEMENT (UTILISATION DE QMF)<br>QMF()<br>----------------------------------------------------<br><br># QUANTIFIED MOTION FILTER (17/08/2003) by HomiE FR (homie.fr@wanadoo.fr)<br># FONCTION D'ESTIMATION DE MOUVEMENT<br>function ME()<br>{<br>&nbsp; # PARAMETRAGE DES NIVEAUX DE MOUVEMENT EN FONCTION DE LA DIFFERENCE MOYENNE [1]<br>&nbsp; <b>global motion_level</b> = (<b>diff</b> &lt; threshold_lm) ? 0 : motion_level<br>&nbsp; <b>global motion_level</b> = (<b>diff</b> &gt;= threshold_lm &amp;&amp; <b>diff</b> &lt;= threshold_hm) ? 1 : motion_level<br>&nbsp; <b>global motion_level</b> = (<b>diff</b> &gt; threshold_hm) ? 2 : motion_level<br>}<br><br># FONCTION QUANTIFIED MOTION FILTER (FILTRE DE MOUVEMENT QUANTIFIE)<br>function QMF(clip c, float "threshold_lm", float "threshold_hm", bool "debug")<br>{<br>&nbsp; # PARAMETRAGE DES LIMITES DES NIVEAUX DE MOUVEMENT [2]<br>&nbsp; threshold_lm = default(threshold_lm, 4.0)<br>&nbsp; threshold_hm = default(threshold_hm, 12.0)<br>&nbsp; global threshold_lm = threshold_lm<br>&nbsp; global threshold_hm = threshold_hm<br><br>&nbsp; # ACTIVATION/DESACTIVATION DES INFORMATIONS DE DEBUGAGE [3]<br>&nbsp; debug = default(debug, false)<br><br>&nbsp; # INITIALISATION DU NIVEAU DE MOUVEMENT<br>&nbsp; global motion_level = 0<br><br>&nbsp; # PARAMETRAGE DU CLIP ACTUEL [4]<br>&nbsp; global clip = c<br><br>&nbsp; # OBTENTION DE LA RESOLUTION DE SORTIE [5]<br>&nbsp; width = Width(Low_Motion_Filter(c))<br>&nbsp; height = Height(Low_Motion_Filter(c))<br>&nbsp; global c_resized = PointResize(c, width, height)<br><br>&nbsp; # UTILISATION DU FILTRE DE MOUVEMENT EN FONCTION DU NIVEAU DE MOUVEMENT [6]<br>&nbsp; c = ConditionalFilter(c, Low_Motion_Filter(c), c_resized, "<b>motion_level</b>", "=", "0")&nbsp; # [6a]<br>&nbsp; c = ConditionalFilter(c, Medium_Motion_Filter(c), c, "<b>motion_level</b>", "=", "1")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # [6b]<br>&nbsp; c = ConditionalFilter(c, High_Motion_Filter(c), c, "<b>motion_level</b>", "=", "2")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # [6c]<br><br>&nbsp; # AFFICHAGE DES INFORMATIONS DE DEBUG [7]<br>&nbsp; c = (debug == true) ? ScriptClip(c, "Debug()") : c<br><br>&nbsp; # OBTENTION DU NIVEAU DE MOUVEMENT A TRAVERS L'ESTIMATION DE MOUVEMENT [8]<br>&nbsp; c = FrameEvaluate(c, "ME()")<br><br>&nbsp; # OBTENTION DE LA DIFFERENCE ENTRE LES IMAGES PRECEDENTES/ACTUELLES [9]<br>&nbsp; c = FrameEvaluate(c, "<b>global diff</b> = 0.50*YDifferenceFromPrevious(clip) + 0.25*UDifferenceFromPrevious(clip) + 0.25*VDifferenceFromPrevious(clip)")<br>&nbsp; return c<br>}<br><br># FONCTION D'INFORMATION DE DEBUGAGE<br>function Debug(clip c)<br>{<br>&nbsp; # AFFICHAGE DE L'INFORMATION DE VERISON [10]<br>&nbsp; c = Subtitle(c, "Quantified Motion Filter", x=20, y=30, font="lucida console", size=18, text_color=$FFFFFF)<br>&nbsp; c = Subtitle(c, "by HomiE FR (homie.fr@wanadoo.fr)", x=20, y=45, font="lucida console", size=14, text_color=$FFFFFF)<br><br>&nbsp; # AFFICHAGE DE L'INFORMATION D'ESTIMATION DE MOUVEMENT[11]<br>&nbsp; c = Subtitle(c, "motion estimation", x=20, y=85, font="lucida console", size=18, text_color=$FFFFFF)<br>&nbsp; c = Subtitle(c, "diff = "+string(<b>diff</b>), x=20,y=110, font="lucida console", size=16, text_color=$FFCCCC)<br><br>&nbsp; # AFFICHAGE DE L'INFORMATION DU FILTRE DE MOUVEMENT QUANTIFIE [12]<br>&nbsp; c = Subtitle(c, "quantified motion filter", x=20, y=135, font="lucida console", size=18, text_color=$FFFFFF)<br>&nbsp; c = (<b>motion_level</b> == 0) ? Subtitle(c, "scene type = low motion", x=20, y=160, font="lucida console", size=16, text_color=$66FF66) : c<br>&nbsp; c = (<b>motion_level</b> == 1) ? Subtitle(c, "scene type = medium motion", x=20, y=160, font="lucida console", size=16, text_color=$66FF66) : c<br>&nbsp; c = (<b>motion_level</b> == 2) ? Subtitle(c, "scene type = high motion", x=20, y=160, font="lucida console", size=16, text_color=$66FF66) : c<br>&nbsp; return c<br>}<br>----------------------------------------------------</pre>
Cette cha&icirc;ne de filtre fonctionne de la mani&egrave;re suivante:
<ul>

  <li>Quand VirtualDub demande une image, AviSynth demande une image &agrave; QMF.</li>

  <ul>

    <li>
QMF demande une image &agrave; FrameEvaluate [9].</li>

    <li>Apr&egrave;s cela le script [9] est &eacute;valu&eacute;, et la variable globale <i>diff</i>est
enregistr&eacute;e apr&egrave;s avoir demand&eacute; une image &agrave;
AviSource. FrameEvaluate [9] demande une image &agrave; FrameEvaluate
[8].</li>

    <li>Une nouvelle fois, le script [8] est &eacute;valu&eacute;:</li>

    <ul>

      <li>en &eacute;valuant me(), la variable globale <i>motion_level</i>
est enregistr&eacute;e pour cette image [1]</li>

    </ul>

    <li>Si debug=true (vrai), une image est demand&eacute;e &agrave; ScriptClip [7], et donc &agrave;&nbsp;Debug().</li>

    <li>Apr&egrave;s cela (&eacute;galement quand debug est
assign&eacute; &agrave; la valeur false (faux)), une image est
demand&eacute;e au dernier ConditionalFilter [6c], qui demande une
image &agrave; [6b], qui lui m&ecirc;me demande une image &agrave; [6a].</li>

    <ul>

      <li>Notez qu'&agrave; la fin, une image de High_Motion_filter, de
Medium_Motion_filter,
ou de Low_Motion_filter est demand&eacute;e en fonction de la valeur de&nbsp;<i>motion_level</i>.</li>

    </ul>

  </ul>

  <li>QMF demande une image &agrave; Telecide, Telecide en demande une
&agrave; ConvertToYV12 &nbsp;et &agrave; la fin, ConvertToYV12 en
demande une &agrave; AviSource.</li>

  <li>
AviSource cr&eacute;e l'image et l'envoie &agrave; ConvertToYV12, etc...</li>

</ul>

<p>Certains d&eacute;tails ont &eacute;t&eacute; supprim&eacute;s mais
c'est globalement la mani&egrave;re dont ce filtre fonctionne.
</p>

<p><kbd>$English date: 2005/01/26 22:08:35 $<br>

French translation date: 2005/11/01 JasonFly <a href="mailto:macpaille@users.sourceforge.net">macpaille@users.sourceforge.net</a></kbd>
</p>

<form><input value="Retour" onclick="history.go(-1)" type="button"></form>

</body>
</html>
